//package com.usian;
//
//import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
//import com.baomidou.mybatisplus.core.toolkit.StringPool;
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import com.baomidou.mybatisplus.generator.AutoGenerator;
//import com.baomidou.mybatisplus.generator.InjectionConfig;
//import com.baomidou.mybatisplus.generator.config.*;
//import com.baomidou.mybatisplus.generator.config.po.TableInfo;
//import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
//import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
//
//import java.sql.Connection;
//import java.sql.DriverManager;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Scanner;
//
//
///**
// * 功能说明：
// *      1、生成输入的表的xml、dao、service、serviceimpl、controller所有单表增删改查相关代码
// *      2、可以设置去掉表前缀功能
// *      3、可单独生成一个或者多个表，也可以直接生成库中所有表，按提示操作即可
// * 使用说明：
// *      1、需要提前设置数据库名称、用户名、密码，大约在84行附近，参数为myDbName等，可以搜索定位
// *      2、如果需要使用生成controller内容功能
// *          需要将controller.java.ftl文件，放在resources下的templates目录中
// *          并解开代码：templateConfig.setController("templates/controller.java")，大约在132行，可以搜索定位
// *      3、如果表有全局前缀，想要生成的实体不带前缀，
// *          需要解开代码：strategy.setTablePrefix("填写示例：cn_")，大约在141行，可以搜索定位
// *      4、需要依赖：
// *          <dependency>
// *             <groupId>com.baomidou</groupId>
// *             <artifactId>mybatis-plus-generator</artifactId>
// *             <version>3.4.0</version>
// *         </dependency>
// *         <dependency>
// *             <groupId>org.freemarker</groupId>
// *             <artifactId>freemarker</artifactId>
// *             <version>2.3.31</version>
// *         </dependency>
// * @author 马国凌
// * @since 2023-01-31
// */
//public class Gene {
//
//    /**
//     * <p>
//     * 读取控制台内容，固定方法，勿动
//     * </p>
//     */
//    public static String scanner(String tip) {
//        Scanner scanner = new Scanner(System.in);
//        StringBuilder help = new StringBuilder();
//        help.append("请输入" + tip + "：");
//        System.out.println(help.toString());
//        if (scanner.hasNext()) {
//            String ipt = scanner.next();
//            if (StringUtils.isNotBlank(ipt)) {
//                return ipt;
//            }
//        }
//        throw new MybatisPlusException("请输入正确的" + tip + "！");
//    }
//
//    public static void main(String[] args) throws Exception{
//        // 代码生成器
//        AutoGenerator mpg = new AutoGenerator();
//
//        // 全局配置
//        GlobalConfig gc = new GlobalConfig();
//        String projectPath = System.getProperty("user.dir");
//        gc.setOutputDir(projectPath + "/src/main/java");
//        gc.setAuthor("马国凌");
//        gc.setOpen(false);
//        // gc.setSwagger2(true); 实体属性 Swagger2 注解
//        mpg.setGlobalConfig(gc);
//
//        // 数据源配置
//        DataSourceConfig dsc = new DataSourceConfig();
//        String myDbName = "test";//数据库名称
//        dsc.setUrl("jdbc:mysql://192.168.110.141:3306/"+myDbName+"?useUnicode=true&useSSL=false&characterEncoding=utf8");
//        // dsc.setSchemaName("public");
//        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
//        dsc.setUsername("root");
//        dsc.setPassword("123456");
//        mpg.setDataSource(dsc);
//
//        // 包配置
//        PackageConfig pc = new PackageConfig();
////        pc.setModuleName(scanner("模块名"));
//        pc.setParent("com.cn");
//        mpg.setPackageInfo(pc);
//
//        // 自定义配置
//        InjectionConfig cfg = new InjectionConfig() {
//            @Override
//            public void initMap() {
//                // to do nothing
//            }
//        };
//
//        // 如果模板引擎是 freemarker
//        String templatePath = "/templates/mapper.xml.ftl";
//        // 如果模板引擎是 velocity
//        // String templatePath = "/templates/mapper.xml.vm";
//
//        // 自定义输出配置
//        List<FileOutConfig> focList = new ArrayList<>();
//        // 自定义配置会被优先输出
//        focList.add(new FileOutConfig(templatePath) {
//            @Override
//            public String outputFile(TableInfo tableInfo) {
//                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
//                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
//            }
//        });
//        cfg.setFileOutConfigList(focList);
//        mpg.setCfg(cfg);
//
//        // 配置模板
//        TemplateConfig templateConfig = new TemplateConfig();
//
//        // 配置自定义输出模板
//        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
//        // templateConfig.setService();
//        templateConfig.setEntity("templates/entity.java");
//        templateConfig.setController("templates/controller.java");
//
//        templateConfig.setXml(null);
//        mpg.setTemplate(templateConfig);
//
//        // 策略配置
//        StrategyConfig strategy = new StrategyConfig();
//        strategy.setNaming(NamingStrategy.underline_to_camel);
//        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
////        strategy.setTablePrefix("填写示例：cn_");//重要，如果要生成的实体类不带表前缀，需要设置此项
//        strategy.setEntityLombokModel(true);
//        strategy.setRestControllerStyle(true);
//
//        //设置输入的表名
//        String tableNames = scanner("表名，多个英文逗号分割，输入666可生成当前库下所有表信息");
//
//        if ("666".equals(tableNames)) {
//            strategy.setInclude(getTables(myDbName,dsc));
//        }else{
//            strategy.setInclude(tableNames.split(","));
//        }
//
//        strategy.setControllerMappingHyphenStyle(true);
//        mpg.setStrategy(strategy);
//        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
//        mpg.execute();
//    }
//
//
//    /**
//     * 获取某个数据库中的所有表名，固定方法，勿动
//     * @param dbName
//     * @return
//     * @throws Exception
//     */
//    private static String[] getTables(String dbName,DataSourceConfig dsc) throws Exception {
//        List<String> tables = new ArrayList<>();
//
//        Connection connection = null;
//        PreparedStatement ps = null;
//        ResultSet resultSet = null;
//        try {
//            Class.forName(dsc.getDriverName());
//            connection = DriverManager.getConnection(dsc.getUrl(),dsc.getUsername(),dsc.getPassword());
//            String sql = "select table_name from information_schema.tables where table_schema=?";
//            ps = connection.prepareStatement(sql);
//            ps.setString(1,dbName);
//            resultSet = ps.executeQuery();
//            while (resultSet.next()) {
//                tables.add(resultSet.getString("table_name"));
//            }
//            String[] result = tables.toArray(new String[tables.size()]);
//            return result;
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            if (resultSet != null) {
//                try {
//                    resultSet.close();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//            if (ps != null) {
//                try {
//                    ps.close();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//            if (connection != null) {
//                try {
//                    connection.close();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        throw new Exception("数据库连接异常！");
//    }
//
//}
